package van.planifolia.service.impl;

import org.springframework.stereotype.Service;
import van.planifolia.mapper.PermissionDao;
import van.planifolia.pojo.Permission;
import van.planifolia.pojo.User;
import van.planifolia.service.PermissionService;
import van.planifolia.util.WebUtil;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Intellij IDEA<br>
 * 权限的实现类
 *
 * @author Planifolia.Van
 * @version 1.0
 * @date 2022/10/10 15:51
 */
@Service("permissionService")
public class PermissionServiceImpl implements PermissionService {
    /**
     * 引入dao层
     */
    @Resource(name = "permissionDao")
    PermissionDao permissionDao;

    /**
     * 查询当前登录用户的全部权限
     *
     * @return 全部权限
     */
    @Override
    public List<Permission> getUserPermission() {
        User user = (User) WebUtil.getSession().getAttribute("loginInfo");
        List<Permission> permissions = permissionDao.selectPermissionByUserId(user.getUid());
        return makeFatherSonShip(permissions);
    }

    /**
     * 查询当前角色的权限，以及全部权限
     *
     * @return 角色权限以及全部权限
     */
    @Override
    public Map<String, Object> getRolePermission(Integer rid) {
        Map<String, Object> perMap = new HashMap<>();

        List<Permission> allPermissions = permissionDao.selectAllPermission();
        List<Integer> rolePers = permissionDao.selectPermissionByRid(rid);
        perMap.put("allPermissions", makeFatherSonShip(allPermissions));
        perMap.put("rolePers", rolePers);

        return perMap;
    }

    /**
     * 工具方法来实现生成权限的父子关系
     *
     * @param permissions 权限的元数据
     * @return 生成父子关系的数据
     */
    private List<Permission> makeFatherSonShip(List<Permission> permissions) {
        // 创建一个list用来保存一级权限
        List<Permission> firstPers = new ArrayList<>();
        // 便利全部的权限，找到一级权限放到firstPer里面
        for (Permission permission : permissions) {
            if (permission.getPpid().equals(0)) {
                firstPers.add(permission);
            }
        }
        //便利一级权限并且在内部便利全部权限将二级权限放到对应的一级权限中
        for (Permission firstPer : firstPers) {
            // 创建一个List来保存二层的权限菜单
            List<Permission> secondPer = new ArrayList<>();
            // 便利全部的权限找到对应的二层权限放到secondPer
            for (Permission permission : permissions) {
                if (permission.getPpid().equals(firstPer.getPid())) {
                    secondPer.add(permission);
                }
            }
            // 最后将secondPer放到最外层中，然后只要返回最外层就行了
            firstPer.setChildPermission(secondPer);
        }
        return firstPers;
    }

    /**
     * 修改角色的权限
     *
     * @param rid  当前角色id
     * @param pers 角色的权限们
     * @return 是否修改成功
     */
    @Override
    public boolean modifyRolePermission(Integer rid, Integer[] pers) {

        //先删除
        int a = permissionDao.deleteAllPerByRid(rid);
        //在插入
        int b = permissionDao.insertPerByRid(rid, pers);

        return a > 0 && b > 0;
    }
}
